﻿///@author Rafał Hazan
///@email  rafal.hazan@gmail.com
#ifndef __EVOLUTIONARY_ALGORITHM__
#define __EVOLUTIONARY_ALGORITHM__

#include "MatrixGraph.h"
#include "Genotype.h"

#include <set>

class PopulationInitializer;
class StopCondition;
class SelectOperator;
class CrossoverOperator;
class MutationOperator;
class ReplacementOperator;

/// Glowna klasa algorytmu ewolucyjnego.
class EvolutionaryAlgorithm
{
public:
	/// Typ pojemnika przechowujacego populacja. Zbior genotypow (genotypy nie powinny sie powtarzac. Dodatkowo kolejnosc jest zachowana).
	typedef std::set<Genotype> population_type;

public:
	/// Liczba iteracji algorytmu (sprawdzen warunku stopu).
	static long iterationNo; 
	///populacja glowna
	population_type population;

private:
	PopulationInitializer & _initializer;
	StopCondition & _stop;
	SelectOperator & _selection;
	CrossoverOperator & _crossover;
	MutationOperator & _mutation;
	ReplacementOperator & _replacement;

public:
	EvolutionaryAlgorithm(PopulationInitializer & initializer, 
		StopCondition & stop, 
		SelectOperator & select, 
		CrossoverOperator & crossover, 
		MutationOperator & mutation, 
		ReplacementOperator & replacement);

	/// Rozpocznij algorytm z podanymi operatorami.
	void perform(const MatrixGraph & graph);
};

#endif